﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;

namespace Clinica_Frba
{
    class ManejadorDeAltas
    {
        public ManejadorDeAltas()
        {

        }

        static string STR_ERROR_DNI_DUPLICADO = "El DNI ingresado ya se encuentra en la Base de Datos. Abortando toda la operacion.";

        private bool ProcesarNuevaAltaAfiliado(ref Queue<InfoDeAfiliado> colaDeAfiliados)
        {
            FormAltaAfiliado formAProcesar = new FormAltaAfiliado();

            formAProcesar.ShowDialog();
            if (!formAProcesar.FueSatisfactorio())
                return false;

            InfoDeAfiliado afiliadoAProcesar = formAProcesar.ObtenerInformacion();

            for (int i = 0; i < colaDeAfiliados.Count; ++i)
            {
                if (colaDeAfiliados.ElementAt(i).strNumeroDeDocumento == afiliadoAProcesar.strNumeroDeDocumento)
                {
                    Dialogos.MostrarMessageDialog(STR_ERROR_DNI_DUPLICADO);
                    return false;
                }
            }
            colaDeAfiliados.Enqueue(afiliadoAProcesar);
            return true;
        }

        public void Ejecutar()
        {
            Queue<InfoDeAfiliado> colaDeAfiliadosAProcesar = new Queue<InfoDeAfiliado>();

            //Afiliado Titular
            if (!ProcesarNuevaAltaAfiliado(ref colaDeAfiliadosAProcesar))
                return;

            if (colaDeAfiliadosAProcesar.First().strEstadoCivil == "CASADO" && Dialogos.MostrarYesNoDialog("Dar de alta a su conyuge?"))
            {
                if (!ProcesarNuevaAltaAfiliado(ref colaDeAfiliadosAProcesar))
                    return;
            }

            while (Dialogos.MostrarYesNoDialog("Dar de alta a algun otro familiar?"))
            {
                if (!ProcesarNuevaAltaAfiliado(ref colaDeAfiliadosAProcesar))
                    return;
            }

            colaDeAfiliadosAProcesar.First().strCantidadDeFamiliaresDependientes = (colaDeAfiliadosAProcesar.Count - 1).ToString();

            SqlConnection myConnection = new SqlConnection(publico.ConnectionString);
            myConnection.Open();

            string strQuery = "SELECT ULTIMOID FROM PROVIDERID WHERE TABLA = 'AFILIADO' ";

            SqlCommand sqlCommand = new SqlCommand(strQuery, myConnection);
            SqlDataReader executeCMD = sqlCommand.ExecuteReader();

            executeCMD.Read();
            int iAfiliadoIDNuevo = int.Parse(executeCMD["ULTIMOID"].ToString());
            iAfiliadoIDNuevo++;

            string strAfiliadoID_aSetear = iAfiliadoIDNuevo.ToString("0000000");

            executeCMD.Close();
            strQuery = "BEGIN TRANSACTION;";
            for (int i = 0; i < colaDeAfiliadosAProcesar.Count; i++)
            {
                colaDeAfiliadosAProcesar.ElementAt(i).strAfiliadoID = strAfiliadoID_aSetear + (i + 1).ToString("00");

                strQuery += "INSERT INTO AFILIADO(ID_AFIL,Apellido,Nombre,TIPO_DOC,NRO_DOC,Direccion,Telefono,mail,FECHA_NACIMIENTO,ESTADO_CIVIL,ID_PLAN,RELATIVOS_A_CARGO,Sexo, ESTADO) SELECT '";
                strQuery += colaDeAfiliadosAProcesar.ElementAt(i).strAfiliadoID + "' , '";
                strQuery += colaDeAfiliadosAProcesar.ElementAt(i).strApellido + "' , '";
                strQuery += colaDeAfiliadosAProcesar.ElementAt(i).strNombre + "' , '";
                strQuery += colaDeAfiliadosAProcesar.ElementAt(i).strTipoDeDocumento + "' , '";
                strQuery += colaDeAfiliadosAProcesar.ElementAt(i).strNumeroDeDocumento + "' , '";
                strQuery += colaDeAfiliadosAProcesar.ElementAt(i).strDireccion + "' , '";
                strQuery += colaDeAfiliadosAProcesar.ElementAt(i).strTelefono + "' , '";
                strQuery += colaDeAfiliadosAProcesar.ElementAt(i).strEmail + "' , ";
                strQuery += "CONVERT(DATETIME, '"+ colaDeAfiliadosAProcesar.ElementAt(i).strFechaDeNacimiento + "',103) , '";
                strQuery += colaDeAfiliadosAProcesar.ElementAt(i).strEstadoCivil + "' , ";
                strQuery += "ID_PLAN, '";//colaDeAfiliadosAProcesar.ElementAt(i).strPlanMedico + "' , '";
                strQuery += colaDeAfiliadosAProcesar.ElementAt(i).strCantidadDeFamiliaresDependientes + "' , '";
                strQuery += colaDeAfiliadosAProcesar.ElementAt(i).strSexo + "' , '";
                strQuery += "H' FROM PLAN_MEDICO WHERE DESCRIPCION = '"+ colaDeAfiliadosAProcesar.ElementAt(i).strPlanMedico +"';";

            }
            strQuery += "UPDATE PROVIDERID SET ULTIMOID = ULTIMOID + 1 WHERE TABLA = 'AFILIADO';";
            strQuery += "COMMIT TRANSACTION;";

            sqlCommand = new SqlCommand(strQuery, myConnection);
            int executeCMD2 = 0;

            try
            {
                executeCMD2 = sqlCommand.ExecuteNonQuery();
            }
            catch (SqlException exception)
            {
                if ( exception.Number == 2627 ) //ERROR CODE de UNIQUE
                    Dialogos.MostrarMessageDialog(STR_ERROR_DNI_DUPLICADO);
                else
                    Dialogos.MostrarMessageDialog(exception.ToString());

                return;
            }
            if(executeCMD2 > 0 )
                Dialogos.MostrarMessageDialog("Operacion completa de manera satisfactoria.");
        }

    }
}
